/**
  ******************************************************************************
  * @file           : Can_Motor_drv.c
  * @brief          : 控制使用can通信控制的电机的驱动源文件
  ******************************************************************************
  * @attention
  * Can_Motor_measure_t_config 用于配置电机参数结构体
  * Can_Motor_cmd函数用于使用指定的can外设,对指定can ID的电机发送控制报文
  * Can_Motor_filter_config函数用于一键配置can通信接收过滤器,函数内容需用
	 户自己维护(调用bsp_can.c中函数来配置)
  ******************************************************************************
  * @needToDo
  * 根据实际情况修改Can_Motor_filter_config中的内容,配置can接收过滤器
  ********************************************************************************************
  */

/*电调报文反馈地址配置表
{
	0x201	01000000001
	0x202	01000000010
	0x203	01000000011
	id		010000000xx
	mask	11111111100
}
{
	0x204	01000000100
	id		01000000100
	mask	11111111111
}
0x205	001000000101
0x206	001000000110
0x207	001000000111
0x208	001000001000

0x209	001000001001
0x20A	001000001010
0x20B	001000001011
*/

#include "Can_Motor_drv.h"


/*	外部变量&头文件链接区 BEGIN	*/


/*	外部变量&头文件链接区 END	*/

/*******************************************************/
/***********************函数定义区**********************/
/*******************************************************/


/**
 * @brief 使用指定的can外设,对指定can ID的大疆电机发送控制报文
 * @param 	hcan 	使用的can外设					@应为 &hcan1 或者 &hcan2
 * @param	ID		电机ID							@应为 0x200,0x1ff,0x2ff,0x1fe,0x2fe
 * @param 	cx		对应ID为x的电机的电流(电压)值	@应为 -10000 ~ 10000(2006电机),
													@或   -16384 ~ 16384(3508电机),
													@或   -25000 ~ 25000(6020电机电压控制),
													@或   -16384 ~ 16384(6020电机电压控制).
 * @return 	none
 */
void Can_Motor_cmd(CAN_HandleTypeDef* hcan,uint16_t ID,int16_t c1,int16_t c2,int16_t c3,int16_t c4)
{
	uint8_t can_m_cmd_tx[8] = {0};
	can_m_cmd_tx[0] = (uint8_t)(c1 >> 8);can_m_cmd_tx[1] = (uint8_t)(c1);	//ID1
	can_m_cmd_tx[2] = (uint8_t)(c2 >> 8);can_m_cmd_tx[3] = (uint8_t)(c2);	//ID2
	can_m_cmd_tx[4] = (uint8_t)(c3 >> 8);can_m_cmd_tx[5] = (uint8_t)(c3);	//ID3
	can_m_cmd_tx[6] = (uint8_t)(c4 >> 8);can_m_cmd_tx[7] = (uint8_t)(c4);	//ID4
	can_send_msg(hcan,ID,can_m_cmd_tx,8);
}


/**
 * @brief 为使用到的电机配置can过滤器
 */
void Can_Motor_filter_config(void)
{
	/* can1配置 START */
	can_config_filter_STD(&hcan1,0x201,0x204,0x7fc,0x7ff,
								0,CAN_FILTER_FIFO0);	//配置0x201~0x204到FIFO0,过滤器0
	can_config_filter_STD(&hcan1,0x205,0x205,0x7ff,0x7ff,
								1,CAN_FILTER_FIFO0);	//配置0x205到FIFO0,过滤器1
	/* can1配置 END */
	
	
	/* can2配置 START */
	can_config_filter_STD(&hcan2,0x201,0x204,0x7fc,0x7ff,
								15,CAN_FILTER_FIFO0);	//配置0x201~0x204到FIFO0,过滤器15
	can_config_filter_STD(&hcan2,0x205,0x205,0x7ff,0x7ff,
								16,CAN_FILTER_FIFO0);	//配置0x205到FIFO0,过滤器16
	/* can2配置 END */
}

/**
 * @brief 配置指定电机的运动状态,角度环状态
 * @param pmmt			电机参数结构体指针
 * @param state			电机运转状态		@args RUN 或者 STOP
 * @param angle_mode	角度环状态			@args ANGLE_REL 或 ANGLE_ABS 或 ANGLE_NO
 * @param stdID			电机的标准canID		@args 0x000~0x7FF
 */
void Can_Motor_measure_t_config(
	Motor_measure_t* pmmt,
	MOTOR_MEASURE_STATE state,
	MOTOR_MEASURE_STATE	angle_mode,
	uint32_t stdID
)
{
	if(pmmt == NULL) return;
	pmmt -> state = state;
	pmmt -> angle_mode = angle_mode;
	pmmt -> stdID = stdID;
}




